<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //用立即调用函数包裹
    (function(){
        function Observer(){

            this.obj = {}

            //订阅信息
            //参数一：消息类型，是string类型
            //参数二：用来接收消息的函数，是function类型
            this.on = function( type , handler ){
                //保存该消息类型及用来接收消息的函数
                
                this.obj[type] = (this.obj[type] ? this.obj[type] : [])
                this.obj[type].push( handler )
                // console.log(this.obj[type]);
            }
            //发布消息
            this.emit = function(type,msg){ //发布消息
                //拿到type对应这个类型消息的所有订阅者的回调函数，调用该函数并将消息传给订阅者
                // console.log(this.obj[type]);
                if( this.obj[type] ){ //做个判断，防止this.obj[type]获取不到而报错
                    this.obj[type].forEach((item)=>{
                        // console.log(item);
                        item(msg)
                        // console.log(item(msg));
                    })
                }
            }
        }
        window.Observer = Observer //暴露函数到外面
    })()

    //实例化对象
    var os = new Observer()

    //订阅信息
    os.on('李嘉琪',function(msg){
        //这里接收来自发布者的消息 msg
        console.log('李莉 收到了来自李嘉琪的消息：' + msg );
    })
    os.on('李嘉琪',function(msg){
        //这里接收来自发布者的消息 msg
        console.log('丽丽 收到了来自李嘉琪的消息：' + msg );
    })
    os.on('李嘉琪',function(msg){
        //这里接收来自发布者的消息 msg
        console.log('莉莉 收到了来自李嘉琪的消息：' + msg );
    })
    //发布消息
    os.emit('李嘉琪' , '一起买买买！')
</script>